package cuatroenraya.jugadores;

import cuatroenraya.Jugador;

public class JugadorAlumnoG13 extends Jugador {
	public JugadorAlumnoG13(){}
	
	public int[] jugar(int[][] tablero)
    {
        int[] punto = new int[2];

//        if para colocar la primera ficha al medio
        if (tablero[4][4] == 0)
        {
            punto[0] = 4;
            punto[1] = 4;
            return punto;
        }
        else
        {
            if (tablero[4][4] != 1)
            {
                if (tablero[3][4] == 0)
                {
                    punto[0] = 3;
                    punto[1] = 4;
                    return punto;
                }
            }
        }
  

        //si no es la primera jugada analizo el tablero


        /***********---------YO----------************/
        int[][] puntajeMio = new int[8][8];
        
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (tablero[i][j] == 0)//analizo los lugares vacios
                {
                    //Jugada horizontal
                    if (puntajeHorizontal(tablero, 1, i, j) == 100)//hay 3 en linea pongo en esta posicion y gano
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeMio[i][j] += puntajeHorizontal(tablero, 1, i, j);

                    //Jugada vertical
                    if (puntajeVertical(tablero, 1, i, j) == 100)//hay 3 en linea pongo en esta posicion y gano
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeMio[i][j] += puntajeVertical(tablero, 1, i, j);

                    //Jugada diagonal ascendente
                    if (puntajeDiagonalAscendente(tablero, 1, i, j) == 100)//hay 3 en linea pongo en esta posicion y gano
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeMio[i][j] += puntajeDiagonalAscendente(tablero, 1, i, j);

                    //Jugada diagonal descendente
                    if (puntajeDiagonalDescendente(tablero, 1, i, j) == 100)//hay 3 en linea pongo en esta posicion y gano
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeMio[i][j] += puntajeDiagonalDescendente(tablero, 1, i, j);


                                            
                }
            }
        }
        /***********---------OPONENTE----------************/
        int[][] puntajeOponente = new int[8][8];

        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (tablero[i][j] == 0)//analizo los lugares vacios
                {
                    //Jugada horizontal
                    if (puntajeHorizontal(tablero, 2, i, j) == 100)//hay 3 en linea pongo en esta posicion y tengo que tapar al jugador
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeOponente[i][j] += puntajeHorizontal(tablero, 2, i, j);

                    //Jugada vertical
                    if (puntajeVertical(tablero, 2, i, j) == 100)//hay 3 en linea pongo en esta posicion y tengo que tapar al jugador
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeOponente[i][j] += puntajeVertical(tablero, 2, i, j);

                    //Jugada diagonal ascendente
                    if (puntajeDiagonalAscendente(tablero, 2, i, j) == 100)//hay 3 en linea pongo en esta posicion y tengo que tapar al jugador
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeOponente[i][j] += puntajeDiagonalAscendente(tablero, 2, i, j);
                    
                    //Jugada diagonal ascendente
                    if (puntajeDiagonalDescendente(tablero, 2, i, j) == 100)//hay 3 en linea pongo en esta posicion y tengo que tapar al jugador
                    {
                        punto[0] = i;
                        punto[1] = j;
                        return punto;
                    }
                    puntajeOponente[i][j] += puntajeDiagonalDescendente(tablero, 2, i, j);

                }
            }
        }
        
        
        
        /********-------ANALISIS DE LA JUGADA-------*********/
        int[] maxMio = new int[3];//1ra posicion guardo la fila, en la 2da la columna y en la 3ra el puntaje
        //busco el MAX puntaje mio
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (puntajeMio[i][j] > maxMio[2])
                {
                    maxMio[0]=i;
                    maxMio[1]=j;
                    maxMio[2] = puntajeMio[i][j];
                }
            }
        }

        int[] maxOponente = new int[3];//1ra posicion guardo la fila, en la 2da la columna y en la 3ra el puntaje
        //busco el MAX puntaje del oponente
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (puntajeOponente[i][j] > maxOponente[2])
                {
                    maxOponente[0] = i;
                    maxOponente[1] = j;
                    maxOponente[2] = puntajeOponente[i][j];
                }
            }
        }


        //veo cual es mayor
        if (maxMio[2] >= maxOponente[2])
        {
            punto[0] = maxMio[0];
            punto[1] = maxMio[1];
        }
        else
        {
            punto[0] = maxOponente[0];
            punto[1] = maxOponente[1];
        }
        return punto;
    }

   


    private int puntajeDiagonalAscendente(int[][] a, int nroJugador, int fila, int col)
    {
        int contador = 0;
        //para la arriba
        for (int i = 1; i <= 3; i++)
        {
            if ((col + i) < 8 && (col + i) > -1 && (fila - i) < 8 && (fila - i) > -1)
            {
                if (a[(fila - i)][(col + i)] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        //para la abajo
        for (int i = 1; i <= 3; i++)
        {
            if ((col - i) < 8 && (col - i) > -1 && (fila + i) < 8 && (fila + i) > -1)
            {
                if (a[(fila + i)][(col - i)] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        return getPuntaje(contador);
    }
    
    private int puntajeDiagonalDescendente(int[][] a, int nroJugador, int fila, int col)
    {
        int contador = 0;
        //para la arriba
        for (int i = 1; i <= 3; i++)
        {
            if ((col - i) < 8 && (col - i) > -1 && (fila - i) < 8 && (fila - i) > -1)
            {
                if (a[(fila - i)][(col - i)] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        //para la abajo
        for (int i = 1; i <= 3; i++)
        {
            if ((col + i) < 8 && (col + i) > -1 && (fila + i) < 8 && (fila + i) > -1)
            {
                if (a[(fila + i)][(col + i)] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        return getPuntaje(contador);
    }
    
    private int puntajeHorizontal(int[][] a, int nroJugador, int fila, int col)
    {
        int contador = 0;
        //para la derecha
        for (int i = 1; i <= 3; i++)
        {
            if ((col + i) < 8 && (col + i) > -1)
            {
                if (a[fila][col + i] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        //para la izquierda
        for (int i = 1; i <= 3; i++)
        {
            if ((col - i) < 8 && (col - i) > -1)
            {
                if (a[fila][col - i] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        return getPuntaje(contador);
    }
    
    private int puntajeVertical(int[][] a, int nroJugador, int fila, int col)
    {
        int contador = 0;
        //para arriba
        for (int i = 1; i <= 3; i++)
        {
            if ((fila + i) < 8 && (fila + i) > -1)
            {
                if (a[fila + i][col] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        //para abajo
        for (int i = 1; i <= 3; i++)
        {
            if ((fila - i) < 8 && (fila - i) > -1)
            {
                if (a[fila - i][col] == nroJugador)
                    contador++;
                else
                    break;
            }
            else
                break;
        }
        return getPuntaje(contador);
    }

    private int getPuntaje(int nro)
    {
        if (nro == 0)
            return 0;
        else if (nro == 1)
            return 1;
        else if (nro == 2)
            return 5;
        else
            return 100;//xq hay 3 en linea
    }

    public String devolverIntegrantes()
    {
    	String str = "yo";
        return str;
    }

    public String devolverNombre()
    {
    	String str = "LALALA";
        return str;
    }

    public String devolverGrupo()
    {
    	String str = "Grupo N�";
        return str;
    }

    public String devolverCurso()
    {
    	String str = "5K4";
        return str;
    }
}
